--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
nomadnet/NomadNetworkApp.py 0.1.9 (34549bda) Text, 34.26 KB
Tff7b72import T7ee787os
Tff7b72import T7ee787io
Tff7b72import T7ee787sys
Tff7b72import T7ee787time
Tff7b72import T7ee787atexit
Tff7b72import T7ee787threading
Tff7b72import T7ee787traceback
Tff7b72import T7ee787contextlib
Tff7b72import T7ee787RNS
Tff7b72import T7ee787LXMF
Tff7b72import T7ee787nomadnet
Tff7b72from T7ee787nomadnetT7ee787.T7ee787Directory Tff7b72import Te6edf3DirectoryEntry
Tff7b72import T7ee787RNST7ee787.T7ee787vendorT7ee787.T7ee787umsgpack Tff7b72as T7ee787msgpack
Tff7b72from T7ee787.T7ee787_version Tff7b72import Te6edf3__version__
Tff7b72from T7ee787.T7ee787vendorT7ee787.T7ee787configobj Tff7b72import Te6edf3ConfigObj
Tff7b72class T56d364NomadNetworkAppTb4b4b4:
Te6edf3time_format Tff7b72= Ta5d6ff"Ta5d6ff%Ta5d6ffY-Ta5d6ff%Ta5d6ffm-Tffd700%dTa5d6ff Ta5d6ff%Ta5d6ffH:Ta5d6ff%Ta5d6ffM:Ta5d6ff%Ta5d6ffSTa5d6ff"
Te6edf3_shared_instance Tff7b72= Tff7b72None
Te6edf3configdir Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffexpanduserTb4b4b4(Ta5d6ff"Ta5d6ff~Ta5d6ff"Tb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff/.nomadnetworkTa5d6ff"
Te6edf3START_ANNOUNCE_DELAY Tff7b72= T79c0ff3
Tff7b72def Td2a8ffexit_handlerTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffNomad Network Client exit handler executing...Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_VERBOSETb4b4b4)
Tff7b72selfTff7b72.Td2a8ffshould_run_jobs Tff7b72= Tff7b72False
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffSaving directory...Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_VERBOSETb4b4b4)
Tff7b72selfTff7b72.Td2a8ffdirectoryTff7b72.Td2a8ffsave_to_diskTb4b4b4(Tb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffNomad Network Client exiting nowTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_VERBOSETb4b4b4)
Tff7b72def Td2a8ffexception_handlerTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3e_typeTb4b4b4, Te6edf3e_valueTb4b4b4, Te6edf3e_tracebackTb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffAn unhandled exception occurred, the details of which will be dumped belowTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffType : Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3e_typeTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffValue : Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3e_valueTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3t_string Tff7b72= Ta5d6ff"Ta5d6ff"
Tff7b72for Te6edf3line Tff7b72in Te6edf3tracebackTff7b72.Td2a8ffformat_tbTb4b4b4(Te6edf3e_tracebackTb4b4b4)Tb4b4b4:
Te6edf3t_string Tff7b72+Tff7b72= Te6edf3line
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffTrace : Tffea00\nTa5d6ff"Tff7b72+Te6edf3t_stringTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72if Tffa657issubclassTb4b4b4(Te6edf3e_typeTb4b4b4, Tf85149KeyboardInterruptTb4b4b4)Tb4b4b4:
Te6edf3sysTff7b72.Td2a8ff__excepthook__Tb4b4b4(Te6edf3e_typeTb4b4b4, Te6edf3e_valueTb4b4b4, Te6edf3e_tracebackTb4b4b4)
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3configdir Tff7b72= Tff7b72NoneTb4b4b4, Te6edf3rnsconfigdir Tff7b72= Tff7b72NoneTb4b4b4, Te6edf3daemon Tff7b72= Tff7b72FalseTb4b4b4, Te6edf3force_console Tff7b72= Tff7b72FalseTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffversion Tff7b72= Te6edf3__version__
Tff7b72selfTff7b72.Td2a8ffenable_client Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffenable_node Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffidentity Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffuimode Tff7b72= Tff7b72None
Tff7b72if Te6edf3configdir Tff7b72== Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffconfigdir Tff7b72= Te6edf3NomadNetworkAppTff7b72.Td2a8ffconfigdir
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffconfigdir Tff7b72= Te6edf3configdir
Tff7b72if Te6edf3force_consoleTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffforce_console_log Tff7b72= Tff7b72True
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffforce_console_log Tff7b72= Tff7b72False
Tff7b72if Te6edf3NomadNetworkAppTff7b72.Td2a8ff_shared_instance Tff7b72== Tff7b72NoneTb4b4b4:
Te6edf3NomadNetworkAppTff7b72.Td2a8ff_shared_instance Tff7b72= Tff7b72self
Tff7b72selfTff7b72.Td2a8ffrns Tff7b72= Te6edf3RNSTff7b72.Td2a8ffReticulumTb4b4b4(Te6edf3configdir Tff7b72= Te6edf3rnsconfigdirTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffconfigpath Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigdirTff7b72+Ta5d6ff"Ta5d6ff/configTa5d6ff"
Tff7b72selfTff7b72.Td2a8ffignoredpath Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigdirTff7b72+Ta5d6ff"Ta5d6ff/ignoredTa5d6ff"
Tff7b72selfTff7b72.Td2a8fflogfilepath Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigdirTff7b72+Ta5d6ff"Ta5d6ff/logfileTa5d6ff"
Tff7b72selfTff7b72.Td2a8fferrorfilepath Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigdirTff7b72+Ta5d6ff"Ta5d6ff/errorsTa5d6ff"
Tff7b72selfTff7b72.Td2a8ffstoragepath Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigdirTff7b72+Ta5d6ff"Ta5d6ff/storageTa5d6ff"
Tff7b72selfTff7b72.Td2a8ffidentitypath Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigdirTff7b72+Ta5d6ff"Ta5d6ff/storage/identityTa5d6ff"
Tff7b72selfTff7b72.Td2a8ffcachepath Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigdirTff7b72+Ta5d6ff"Ta5d6ff/storage/cacheTa5d6ff"
Tff7b72selfTff7b72.Td2a8ffresourcepath Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigdirTff7b72+Ta5d6ff"Ta5d6ff/storage/resourcesTa5d6ff"
Tff7b72selfTff7b72.Td2a8ffconversationpath Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigdirTff7b72+Ta5d6ff"Ta5d6ff/storage/conversationsTa5d6ff"
Tff7b72selfTff7b72.Td2a8ffdirectorypath Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigdirTff7b72+Ta5d6ff"Ta5d6ff/storage/directoryTa5d6ff"
Tff7b72selfTff7b72.Td2a8ffpeersettingspath Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigdirTff7b72+Ta5d6ff"Ta5d6ff/storage/peersettingsTa5d6ff"
Tff7b72selfTff7b72.Td2a8ffpagespath Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigdirTff7b72+Ta5d6ff"Ta5d6ff/storage/pagesTa5d6ff"
Tff7b72selfTff7b72.Td2a8fffilespath Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigdirTff7b72+Ta5d6ff"Ta5d6ff/storage/filesTa5d6ff"
Tff7b72selfTff7b72.Td2a8ffcachepath Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigdirTff7b72+Ta5d6ff"Ta5d6ff/storage/cacheTa5d6ff"
Tff7b72selfTff7b72.Td2a8ffdownloads_path Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffexpanduserTb4b4b4(Ta5d6ff"Ta5d6ff~/DownloadsTa5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8fffirstrun Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffshould_run_jobs Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8ffjob_interval Tff7b72= T79c0ff5
Tff7b72selfTff7b72.Td2a8ffdefer_jobs Tff7b72= T79c0ff90
Tff7b72selfTff7b72.Td2a8ffpeer_announce_at_start Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8fftry_propagation_on_fail Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8ffperiodic_lxmf_sync Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8fflxmf_sync_interval Tff7b72= T79c0ff360Tff7b72*T79c0ff60
Tff7b72selfTff7b72.Td2a8fflxmf_sync_limit Tff7b72= T79c0ff8
Tff7b72if Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisdirTb4b4b4(Tff7b72selfTff7b72.Td2a8ffstoragepathTb4b4b4)Tb4b4b4:
Te6edf3osTff7b72.Td2a8ffmakedirsTb4b4b4(Tff7b72selfTff7b72.Td2a8ffstoragepathTb4b4b4)
Tff7b72if Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisdirTb4b4b4(Tff7b72selfTff7b72.Td2a8ffcachepathTb4b4b4)Tb4b4b4:
Te6edf3osTff7b72.Td2a8ffmakedirsTb4b4b4(Tff7b72selfTff7b72.Td2a8ffcachepathTb4b4b4)
Tff7b72if Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisdirTb4b4b4(Tff7b72selfTff7b72.Td2a8ffresourcepathTb4b4b4)Tb4b4b4:
Te6edf3osTff7b72.Td2a8ffmakedirsTb4b4b4(Tff7b72selfTff7b72.Td2a8ffresourcepathTb4b4b4)
Tff7b72if Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisdirTb4b4b4(Tff7b72selfTff7b72.Td2a8ffconversationpathTb4b4b4)Tb4b4b4:
Te6edf3osTff7b72.Td2a8ffmakedirsTb4b4b4(Tff7b72selfTff7b72.Td2a8ffconversationpathTb4b4b4)
Tff7b72if Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisdirTb4b4b4(Tff7b72selfTff7b72.Td2a8ffpagespathTb4b4b4)Tb4b4b4:
Te6edf3osTff7b72.Td2a8ffmakedirsTb4b4b4(Tff7b72selfTff7b72.Td2a8ffpagespathTb4b4b4)
Tff7b72if Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisdirTb4b4b4(Tff7b72selfTff7b72.Td2a8fffilespathTb4b4b4)Tb4b4b4:
Te6edf3osTff7b72.Td2a8ffmakedirsTb4b4b4(Tff7b72selfTff7b72.Td2a8fffilespathTb4b4b4)
Tff7b72if Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisdirTb4b4b4(Tff7b72selfTff7b72.Td2a8ffcachepathTb4b4b4)Tb4b4b4:
Te6edf3osTff7b72.Td2a8ffmakedirsTb4b4b4(Tff7b72selfTff7b72.Td2a8ffcachepathTb4b4b4)
Tff7b72if Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Tff7b72selfTff7b72.Td2a8ffconfigpathTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffconfig Tff7b72= Te6edf3ConfigObjTb4b4b4(Tff7b72selfTff7b72.Td2a8ffconfigpathTb4b4b4)
Tff7b72tryTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffapplyConfigTb4b4b4(Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffThe configuration file is invalid. The contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3nomadnetTff7b72.Td2a8ffpanicTb4b4b4(Tb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffConfiguration loaded from Ta5d6ff"Tff7b72+Tff7b72selfTff7b72.Td2a8ffconfigpathTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCould not parse the configuration at Ta5d6ff"Tff7b72+Tff7b72selfTff7b72.Td2a8ffconfigpathTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCheck your configuration file for errors!Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3nomadnetTff7b72.Td2a8ffpanicTb4b4b4(Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCould not load config file, creating default configuration file...Ta5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffcreateDefaultConfigTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8fffirstrun Tff7b72= Tff7b72True
Tff7b72if Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Tff7b72selfTff7b72.Td2a8ffidentitypathTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffidentity Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8fffrom_fileTb4b4b4(Tff7b72selfTff7b72.Td2a8ffidentitypathTb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffidentity Tff7b72!= Tff7b72NoneTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffLoaded Primary Identity Tffd700%sTa5d6ff from Tffd700%sTa5d6ff" Tff7b72% Tb4b4b4(Tffa657strTb4b4b4(Tff7b72selfTff7b72.Td2a8ffidentityTb4b4b4)Tb4b4b4, Tff7b72selfTff7b72.Td2a8ffidentitypathTb4b4b4)Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCould not load the Primary Identity from Ta5d6ff"Tff7b72+Tff7b72selfTff7b72.Td2a8ffidentitypathTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3nomadnetTff7b72.Td2a8ffpanicTb4b4b4(Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCould not load the Primary Identity from Ta5d6ff"Tff7b72+Tff7b72selfTff7b72.Td2a8ffidentitypathTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffThe contained exception was: Tffd700%sTa5d6ff" Tff7b72% Tb4b4b4(Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3nomadnetTff7b72.Td2a8ffpanicTb4b4b4(Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffNo Primary Identity file found, creating new...Ta5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffidentity Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffidentityTff7b72.Td2a8ffto_fileTb4b4b4(Tff7b72selfTff7b72.Td2a8ffidentitypathTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCreated new Primary Identity Tffd700%sTa5d6ff" Tff7b72% Tb4b4b4(Tffa657strTb4b4b4(Tff7b72selfTff7b72.Td2a8ffidentityTb4b4b4)Tb4b4b4)Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCould not create and save a new Primary IdentityTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffThe contained exception was: Tffd700%sTa5d6ff" Tff7b72% Tb4b4b4(Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3nomadnetTff7b72.Td2a8ffpanicTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Tff7b72selfTff7b72.Td2a8ffpeersettingspathTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3file Tff7b72= Tffa657openTb4b4b4(Tff7b72selfTff7b72.Td2a8ffpeersettingspathTb4b4b4, Ta5d6ff"Ta5d6ffrbTa5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffpeer_settings Tff7b72= Te6edf3msgpackTff7b72.Td2a8ffunpackbTb4b4b4(Te6edf3fileTff7b72.Td2a8ffreadTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3fileTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72not Ta5d6ff"Ta5d6ffnode_last_announceTa5d6ff" Tff7b72in Tff7b72selfTff7b72.Td2a8ffpeer_settingsTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffpeer_settingsTb4b4b4[Ta5d6ff"Ta5d6ffnode_last_announceTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72None
Tff7b72if Tff7b72not Ta5d6ff"Ta5d6ffpropagation_nodeTa5d6ff" Tff7b72in Tff7b72selfTff7b72.Td2a8ffpeer_settingsTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffpeer_settingsTb4b4b4[Ta5d6ff"Ta5d6ffpropagation_nodeTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72None
Tff7b72if Tff7b72not Ta5d6ff"Ta5d6fflast_lxmf_syncTa5d6ff" Tff7b72in Tff7b72selfTff7b72.Td2a8ffpeer_settingsTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffpeer_settingsTb4b4b4[Ta5d6ff"Ta5d6fflast_lxmf_syncTa5d6ff"Tb4b4b4] Tff7b72= T79c0ff0
Tff7b72if Tff7b72not Ta5d6ff"Ta5d6ffnode_connectsTa5d6ff" Tff7b72in Tff7b72selfTff7b72.Td2a8ffpeer_settingsTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffpeer_settingsTb4b4b4[Ta5d6ff"Ta5d6ffnode_connectsTa5d6ff"Tb4b4b4] Tff7b72= T79c0ff0
Tff7b72if Tff7b72not Ta5d6ff"Ta5d6ffserved_page_requestsTa5d6ff" Tff7b72in Tff7b72selfTff7b72.Td2a8ffpeer_settingsTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffpeer_settingsTb4b4b4[Ta5d6ff"Ta5d6ffserved_page_requestsTa5d6ff"Tb4b4b4] Tff7b72= T79c0ff0
Tff7b72if Tff7b72not Ta5d6ff"Ta5d6ffserved_file_requestsTa5d6ff" Tff7b72in Tff7b72selfTff7b72.Td2a8ffpeer_settingsTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffpeer_settingsTb4b4b4[Ta5d6ff"Ta5d6ffserved_file_requestsTa5d6ff"Tb4b4b4] Tff7b72= T79c0ff0
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCould not load local peer settings from Ta5d6ff"Tff7b72+Tff7b72selfTff7b72.Td2a8ffpeersettingspathTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffThe contained exception was: Tffd700%sTa5d6ff" Tff7b72% Tb4b4b4(Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3nomadnetTff7b72.Td2a8ffpanicTb4b4b4(Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffNo peer settings file found, creating new...Ta5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffpeer_settings Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ffdisplay_nameTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffAnonymous PeerTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffannounce_intervalTa5d6ff"Tb4b4b4: Tff7b72NoneTb4b4b4,
Ta5d6ff"Ta5d6fflast_announceTa5d6ff"Tb4b4b4: Tff7b72NoneTb4b4b4,
Ta5d6ff"Ta5d6ffnode_last_announceTa5d6ff"Tb4b4b4: Tff7b72NoneTb4b4b4,
Ta5d6ff"Ta5d6ffpropagation_nodeTa5d6ff"Tb4b4b4: Tff7b72NoneTb4b4b4,
Ta5d6ff"Ta5d6fflast_lxmf_syncTa5d6ff"Tb4b4b4: T79c0ff0Tb4b4b4,
Ta5d6ff"Ta5d6ffnode_connectsTa5d6ff"Tb4b4b4: T79c0ff0Tb4b4b4,
Ta5d6ff"Ta5d6ffserved_page_requestsTa5d6ff"Tb4b4b4: T79c0ff0Tb4b4b4,
Ta5d6ff"Ta5d6ffserved_file_requestsTa5d6ff"Tb4b4b4: T79c0ff0
Tb4b4b4}
Tff7b72selfTff7b72.Td2a8ffsave_peer_settingsTb4b4b4(Tb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCreated new peer settings fileTa5d6ff"Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCould not create and save a new peer settings fileTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffThe contained exception was: Tffd700%sTa5d6ff" Tff7b72% Tb4b4b4(Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3nomadnetTff7b72.Td2a8ffpanicTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffignored_list Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72if Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Tff7b72selfTff7b72.Td2a8ffignoredpathTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3fh Tff7b72= Tffa657openTb4b4b4(Tff7b72selfTff7b72.Td2a8ffignoredpathTb4b4b4, Ta5d6ff"Ta5d6ffrbTa5d6ff"Tb4b4b4)
Te6edf3ignored_input Tff7b72= Te6edf3fhTff7b72.Td2a8ffreadTb4b4b4(Tb4b4b4)
Te6edf3fhTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Te6edf3ignored_hash_strs Tff7b72= Te6edf3ignored_inputTff7b72.Td2a8ffsplitlinesTb4b4b4(Tb4b4b4)
Tff7b72for Te6edf3hash_str Tff7b72in Te6edf3ignored_hash_strsTb4b4b4:
Tff7b72if Tffa657lenTb4b4b4(Te6edf3hash_strTb4b4b4) Tff7b72== Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffTRUNCATED_HASHLENGTHTff7b72/Tff7b72/T79c0ff8Tff7b72*T79c0ff2Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3ignored_hash Tff7b72= Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Te6edf3hash_strTff7b72.Td2a8ffdecodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffignored_listTff7b72.Td2a8ffappendTb4b4b4(Te6edf3ignored_hashTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCould not decode RNS Identity hash from: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3hash_strTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffThe contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffError while fetching loading list of ignored destinations: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffdirectory Tff7b72= Te6edf3nomadnetTff7b72.Td2a8ffDirectoryTb4b4b4(Tff7b72selfTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffmessage_router Tff7b72= Te6edf3LXMFTff7b72.Td2a8ffLXMRouterTb4b4b4(Te6edf3identity Tff7b72= Tff7b72selfTff7b72.Td2a8ffidentityTb4b4b4, Te6edf3storagepath Tff7b72= Tff7b72selfTff7b72.Td2a8ffstoragepathTb4b4b4, Te6edf3autopeer Tff7b72= Tff7b72TrueTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffregister_delivery_callbackTb4b4b4(Tff7b72selfTff7b72.Td2a8fflxmf_deliveryTb4b4b4)
Tff7b72for Te6edf3destination_hash Tff7b72in Tff7b72selfTff7b72.Td2a8ffignored_listTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffignore_destinationTb4b4b4(Te6edf3destination_hashTb4b4b4)
Tff7b72selfTff7b72.Td2a8fflxmf_destination Tff7b72= Tff7b72selfTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffregister_delivery_identityTb4b4b4(Tff7b72selfTff7b72.Td2a8ffidentityTb4b4b4, Te6edf3display_nameTff7b72=Tff7b72selfTff7b72.Td2a8ffpeer_settingsTb4b4b4[Ta5d6ff"Ta5d6ffdisplay_nameTa5d6ff"Tb4b4b4]Tb4b4b4)
Tff7b72selfTff7b72.Td2a8fflxmf_destinationTff7b72.Td2a8ffset_default_app_dataTb4b4b4(Tff7b72selfTff7b72.Td2a8ffget_display_name_bytesTb4b4b4)
Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffrememberTb4b4b4(
Te6edf3packet_hashTff7b72=Tff7b72NoneTb4b4b4,
Te6edf3destination_hashTff7b72=Tff7b72selfTff7b72.Td2a8fflxmf_destinationTff7b72.Td2a8ffhashTb4b4b4,
Te6edf3public_keyTff7b72=Tff7b72selfTff7b72.Td2a8ffidentityTff7b72.Td2a8ffget_public_keyTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3app_dataTff7b72=Tff7b72None
Tb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffLXMF Router ready to receive on: Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Tff7b72selfTff7b72.Td2a8fflxmf_destinationTff7b72.Td2a8ffhashTb4b4b4)Tb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffenable_nodeTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffset_message_storage_limitTb4b4b4(Te6edf3gigabytesTff7b72=Tff7b72selfTff7b72.Td2a8ffmessage_storage_limitTb4b4b4)
Tff7b72for Te6edf3dest_str Tff7b72in Tff7b72selfTff7b72.Td2a8ffprioritised_lxmf_destinationsTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3dest_hash Tff7b72= Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Te6edf3dest_strTb4b4b4)
Tff7b72if Tffa657lenTb4b4b4(Te6edf3dest_hashTb4b4b4) Tff7b72== Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffTRUNCATED_HASHLENGTHTff7b72/Tff7b72/T79c0ff8Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffprioritiseTb4b4b4(Te6edf3dest_hashTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCannot prioritise Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3dest_strTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff, it is not a valid destination hashTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffenable_propagationTb4b4b4(Tb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffLXMF Propagation Node started on: Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Tff7b72selfTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffpropagation_destinationTff7b72.Td2a8ffhashTb4b4b4)Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffnode Tff7b72= Te6edf3nomadnetTff7b72.Td2a8ffNodeTb4b4b4(Tff7b72selfTb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffnode Tff7b72= Tff7b72None
Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffregister_announce_handlerTb4b4b4(Te6edf3nomadnetTff7b72.Td2a8ffConversationTb4b4b4)
Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffregister_announce_handlerTb4b4b4(Te6edf3nomadnetTff7b72.Td2a8ffDirectoryTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffautoselect_propagation_nodeTb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffpeer_announce_at_startTb4b4b4:
Tff7b72def Td2a8ffdelayed_announceTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(Te6edf3NomadNetworkAppTff7b72.Td2a8ffSTART_ANNOUNCE_DELAYTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffannounce_nowTb4b4b4(Tb4b4b4)
Te6edf3da_thread Tff7b72= Te6edf3threadingTff7b72.Td2a8ffThreadTb4b4b4(Te6edf3targetTff7b72=Te6edf3delayed_announceTb4b4b4)
Te6edf3da_threadTff7b72.Td2a8ffsetDaemonTb4b4b4(Tff7b72TrueTb4b4b4)
Te6edf3da_threadTff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)
Te6edf3atexitTff7b72.Td2a8ffregisterTb4b4b4(Tff7b72selfTff7b72.Td2a8ffexit_handlerTb4b4b4)
Te6edf3sysTff7b72.Td2a8ffexcepthook Tff7b72= Tff7b72selfTff7b72.Td2a8ffexception_handler
Te6edf3job_thread Tff7b72= Te6edf3threadingTff7b72.Td2a8ffThreadTb4b4b4(Te6edf3targetTff7b72=Tff7b72selfTff7b72.Td2a8ff__jobsTb4b4b4)
Te6edf3job_threadTff7b72.Td2a8ffsetDaemonTb4b4b4(Tff7b72TrueTb4b4b4)
Te6edf3job_threadTff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)
T8b949e# Override UI choice from config on --daemon switch
Tff7b72if Te6edf3daemonTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffuimode Tff7b72= Te6edf3nomadnetTff7b72.Td2a8ffuiTff7b72.Td2a8ffUI_NONE
T8b949e# This stderr redirect is needed to stop urwid
T8b949e# from spewing KeyErrors to the console and thus,
T8b949e# messing up the UI. A pull request to fix the
T8b949e# bug in urwid was submitted, but until it is
T8b949e# merged, this hack will mitigate it.
Te6edf3strio Tff7b72= Te6edf3ioTff7b72.Td2a8ffStringIOTb4b4b4(Tb4b4b4)
Tff7b72with Te6edf3contextlibTff7b72.Td2a8ffredirect_stderrTb4b4b4(Te6edf3strioTb4b4b4)Tb4b4b4:
Te6edf3nomadnetTff7b72.Td2a8ffuiTff7b72.Td2a8ffspawnTb4b4b4(Tff7b72selfTff7b72.Td2a8ffuimodeTb4b4b4)
Tff7b72if Te6edf3strioTff7b72.Td2a8fftellTb4b4b4(Tb4b4b4) Tff7b72> T79c0ff0Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3strioTff7b72.Td2a8ffseekTb4b4b4(T79c0ff0Tb4b4b4)
Te6edf3err_file Tff7b72= Tffa657openTb4b4b4(Tff7b72selfTff7b72.Td2a8fferrorfilepathTb4b4b4, Ta5d6ff"Ta5d6ffwTa5d6ff"Tb4b4b4)
Te6edf3err_fileTff7b72.Td2a8ffwriteTb4b4b4(Te6edf3strioTff7b72.Td2a8ffreadTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3err_fileTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCould not write stderr output to error log file at Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tff7b72selfTff7b72.Td2a8fferrorfilepathTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff.Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffThe contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72def Td2a8ff__jobsTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffDeferring scheduled jobs for Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdefer_jobsTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff seconds...Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdefer_jobsTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffStarting job scheduler nowTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72while Tff7b72selfTff7b72.Td2a8ffshould_run_jobsTb4b4b4:
Te6edf3now Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3now Tff7b72> Tff7b72selfTff7b72.Td2a8ffpeer_settingsTb4b4b4[Ta5d6ff"Ta5d6fflast_lxmf_syncTa5d6ff"Tb4b4b4] Tff7b72+ Tff7b72selfTff7b72.Td2a8fflxmf_sync_intervalTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffInitiating automatic LXMF syncTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_VERBOSETb4b4b4)
Tff7b72selfTff7b72.Td2a8ffrequest_lxmf_syncTb4b4b4(Te6edf3limitTff7b72=Tff7b72selfTff7b72.Td2a8fflxmf_sync_limitTb4b4b4)
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(Tff7b72selfTff7b72.Td2a8ffjob_intervalTb4b4b4)
Tff7b72def Td2a8ffset_display_nameTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3display_nameTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffpeer_settingsTb4b4b4[Ta5d6ff"Ta5d6ffdisplay_nameTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3display_name
Tff7b72selfTff7b72.Td2a8fflxmf_destinationTff7b72.Td2a8ffdisplay_name Tff7b72= Te6edf3display_name
Tff7b72selfTff7b72.Td2a8ffsave_peer_settingsTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ffget_display_nameTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ffpeer_settingsTb4b4b4[Ta5d6ff"Ta5d6ffdisplay_nameTa5d6ff"Tb4b4b4]
Tff7b72def Td2a8ffget_display_name_bytesTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ffpeer_settingsTb4b4b4[Ta5d6ff"Ta5d6ffdisplay_nameTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)
Tff7b72def Td2a8ffget_sync_statusTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffpropagation_transfer_state Tff7b72== Te6edf3LXMFTff7b72.Td2a8ffLXMRouterTff7b72.Td2a8ffPR_IDLETb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ffIdleTa5d6ff"
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffpropagation_transfer_state Tff7b72== Te6edf3LXMFTff7b72.Td2a8ffLXMRouterTff7b72.Td2a8ffPR_PATH_REQUESTEDTb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ffPath requestedTa5d6ff"
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffpropagation_transfer_state Tff7b72== Te6edf3LXMFTff7b72.Td2a8ffLXMRouterTff7b72.Td2a8ffPR_LINK_ESTABLISHINGTb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ffEstablishing linkTa5d6ff"
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffpropagation_transfer_state Tff7b72== Te6edf3LXMFTff7b72.Td2a8ffLXMRouterTff7b72.Td2a8ffPR_LINK_ESTABLISHEDTb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ffLink establishedTa5d6ff"
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffpropagation_transfer_state Tff7b72== Te6edf3LXMFTff7b72.Td2a8ffLXMRouterTff7b72.Td2a8ffPR_REQUEST_SENTTb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ffSync request sentTa5d6ff"
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffpropagation_transfer_state Tff7b72== Te6edf3LXMFTff7b72.Td2a8ffLXMRouterTff7b72.Td2a8ffPR_RECEIVINGTb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ffReceiving messagesTa5d6ff"
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffpropagation_transfer_state Tff7b72== Te6edf3LXMFTff7b72.Td2a8ffLXMRouterTff7b72.Td2a8ffPR_RESPONSE_RECEIVEDTb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ffMessages receivedTa5d6ff"
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffpropagation_transfer_state Tff7b72== Te6edf3LXMFTff7b72.Td2a8ffLXMRouterTff7b72.Td2a8ffPR_COMPLETETb4b4b4:
Te6edf3new_msgs Tff7b72= Tff7b72selfTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffpropagation_transfer_last_result
Tff7b72if Te6edf3new_msgs Tff7b72== T79c0ff0Tb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ffDone, no new messagesTa5d6ff"
Tff7b72elseTb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ffDownloaded Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3new_msgsTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff new messagesTa5d6ff"
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffpropagation_transfer_state Tff7b72== Te6edf3LXMFTff7b72.Td2a8ffLXMRouterTff7b72.Td2a8ffPR_NO_IDENTITY_RCVDTb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ffNode did not receive identificationTa5d6ff"
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffpropagation_transfer_state Tff7b72== Te6edf3LXMFTff7b72.Td2a8ffLXMRouterTff7b72.Td2a8ffPR_NO_ACCESSTb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ffNode did not allow requestTa5d6ff"
Tff7b72elseTb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ffUnknownTa5d6ff"
Tff7b72def Td2a8ffsync_status_show_percentTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffpropagation_transfer_state Tff7b72== Te6edf3LXMFTff7b72.Td2a8ffLXMRouterTff7b72.Td2a8ffPR_IDLETb4b4b4:
Tff7b72return Tff7b72False
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffpropagation_transfer_state Tff7b72== Te6edf3LXMFTff7b72.Td2a8ffLXMRouterTff7b72.Td2a8ffPR_PATH_REQUESTEDTb4b4b4:
Tff7b72return Tff7b72True
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffpropagation_transfer_state Tff7b72== Te6edf3LXMFTff7b72.Td2a8ffLXMRouterTff7b72.Td2a8ffPR_LINK_ESTABLISHINGTb4b4b4:
Tff7b72return Tff7b72True
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffpropagation_transfer_state Tff7b72== Te6edf3LXMFTff7b72.Td2a8ffLXMRouterTff7b72.Td2a8ffPR_LINK_ESTABLISHEDTb4b4b4:
Tff7b72return Tff7b72True
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffpropagation_transfer_state Tff7b72== Te6edf3LXMFTff7b72.Td2a8ffLXMRouterTff7b72.Td2a8ffPR_REQUEST_SENTTb4b4b4:
Tff7b72return Tff7b72True
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffpropagation_transfer_state Tff7b72== Te6edf3LXMFTff7b72.Td2a8ffLXMRouterTff7b72.Td2a8ffPR_RECEIVINGTb4b4b4:
Tff7b72return Tff7b72True
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffpropagation_transfer_state Tff7b72== Te6edf3LXMFTff7b72.Td2a8ffLXMRouterTff7b72.Td2a8ffPR_RESPONSE_RECEIVEDTb4b4b4:
Tff7b72return Tff7b72True
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffpropagation_transfer_state Tff7b72== Te6edf3LXMFTff7b72.Td2a8ffLXMRouterTff7b72.Td2a8ffPR_COMPLETETb4b4b4:
Tff7b72return Tff7b72False
Tff7b72elseTb4b4b4:
Tff7b72return Tff7b72False
Tff7b72def Td2a8ffget_sync_progressTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffpropagation_transfer_progress
Tff7b72def Td2a8ffrequest_lxmf_syncTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3limit Tff7b72= Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffpropagation_transfer_state Tff7b72== Te6edf3LXMFTff7b72.Td2a8ffLXMRouterTff7b72.Td2a8ffPR_IDLE Tff7b72or Tff7b72selfTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffpropagation_transfer_state Tff7b72>Tff7b72= Te6edf3LXMFTff7b72.Td2a8ffLXMRouterTff7b72.Td2a8ffPR_COMPLETETb4b4b4:
Tff7b72selfTff7b72.Td2a8ffpeer_settingsTb4b4b4[Ta5d6ff"Ta5d6fflast_lxmf_syncTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffsave_peer_settingsTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffrequest_messages_from_propagation_nodeTb4b4b4(Tff7b72selfTff7b72.Td2a8ffidentityTb4b4b4, Te6edf3max_messages Tff7b72= Te6edf3limitTb4b4b4)
Tff7b72def Td2a8ffcancel_lxmf_syncTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffpropagation_transfer_state Tff7b72!= Te6edf3LXMFTff7b72.Td2a8ffLXMRouterTff7b72.Td2a8ffPR_IDLETb4b4b4:
Tff7b72selfTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffcancel_propagation_node_requestsTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ffannounce_nowTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8fflxmf_destinationTff7b72.Td2a8ffannounceTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffpeer_settingsTb4b4b4[Ta5d6ff"Ta5d6fflast_announceTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffsave_peer_settingsTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ffautoselect_propagation_nodeTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3selected_node Tff7b72= Tff7b72None
Tff7b72if Ta5d6ff"Ta5d6ffpropagation_nodeTa5d6ff" Tff7b72in Tff7b72selfTff7b72.Td2a8ffpeer_settings Tff7b72and Tff7b72selfTff7b72.Td2a8ffdirectoryTff7b72.Td2a8fffindTb4b4b4(Tff7b72selfTff7b72.Td2a8ffpeer_settingsTb4b4b4[Ta5d6ff"Ta5d6ffpropagation_nodeTa5d6ff"Tb4b4b4]Tb4b4b4)Tb4b4b4:
Te6edf3selected_node Tff7b72= Tff7b72selfTff7b72.Td2a8ffdirectoryTff7b72.Td2a8fffindTb4b4b4(Tff7b72selfTff7b72.Td2a8ffpeer_settingsTb4b4b4[Ta5d6ff"Ta5d6ffpropagation_nodeTa5d6ff"Tb4b4b4]Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3nodes Tff7b72= Tff7b72selfTff7b72.Td2a8ffdirectoryTff7b72.Td2a8ffknown_nodesTb4b4b4(Tb4b4b4)
Te6edf3trusted_nodes Tff7b72= Tb4b4b4[Tb4b4b4]
Te6edf3best_hops Tff7b72= Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffPATHFINDER_MTff7b72+T79c0ff1
Tff7b72for Te6edf3node Tff7b72in Te6edf3nodesTb4b4b4:
Tff7b72if Te6edf3nodeTff7b72.Td2a8fftrust_level Tff7b72== Te6edf3DirectoryEntryTff7b72.Td2a8ffTRUSTEDTb4b4b4:
Te6edf3hops Tff7b72= Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffhops_toTb4b4b4(Te6edf3nodeTff7b72.Td2a8ffsource_hashTb4b4b4)
Tff7b72if Te6edf3hops Tff7b72< Te6edf3best_hopsTb4b4b4:
Te6edf3best_hops Tff7b72= Te6edf3hops
Te6edf3selected_node Tff7b72= Te6edf3node
Tff7b72if Te6edf3selected_node Tff7b72== Tff7b72NoneTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCould not autoselect a propagation node! LXMF propagation will not be available until a trusted node announces on the network.Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_WARNINGTb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3node_identity Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffrecallTb4b4b4(Te6edf3selected_nodeTff7b72.Td2a8ffsource_hashTb4b4b4)
Tff7b72if Te6edf3node_identity Tff7b72!= Tff7b72NoneTb4b4b4:
Te6edf3propagation_hash Tff7b72= Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffhash_from_name_and_identityTb4b4b4(Ta5d6ff"Ta5d6fflxmf.propagationTa5d6ff"Tb4b4b4, Te6edf3node_identityTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffSelecting Ta5d6ff"Tff7b72+Te6edf3selected_nodeTff7b72.Td2a8ffdisplay_nameTff7b72+Ta5d6ff"Ta5d6ff Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3propagation_hashTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff as default LXMF propagation nodeTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_INFOTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffset_outbound_propagation_nodeTb4b4b4(Te6edf3propagation_hashTb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCould not recall identity for autoselected LXMF propagation node Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3selected_nodeTff7b72.Td2a8ffsource_hashTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_WARNINGTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffLXMF propagation will not be available until a trusted node announces on the network.Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_WARNINGTb4b4b4)
Tff7b72def Td2a8ffget_user_selected_propagation_nodeTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Ta5d6ff"Ta5d6ffpropagation_nodeTa5d6ff" Tff7b72in Tff7b72selfTff7b72.Td2a8ffpeer_settingsTb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ffpeer_settingsTb4b4b4[Ta5d6ff"Ta5d6ffpropagation_nodeTa5d6ff"Tb4b4b4]
Tff7b72elseTb4b4b4:
Tff7b72return Tff7b72None
Tff7b72def Td2a8ffset_user_selected_propagation_nodeTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_hashTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffpeer_settingsTb4b4b4[Ta5d6ff"Ta5d6ffpropagation_nodeTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3node_hash
Tff7b72selfTff7b72.Td2a8ffsave_peer_settingsTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffautoselect_propagation_nodeTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ffget_default_propagation_nodeTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffget_outbound_propagation_nodeTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ffsave_peer_settingsTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3file Tff7b72= Tffa657openTb4b4b4(Tff7b72selfTff7b72.Td2a8ffpeersettingspathTb4b4b4, Ta5d6ff"Ta5d6ffwbTa5d6ff"Tb4b4b4)
Te6edf3fileTff7b72.Td2a8ffwriteTb4b4b4(Te6edf3msgpackTff7b72.Td2a8ffpackbTb4b4b4(Tff7b72selfTff7b72.Td2a8ffpeer_settingsTb4b4b4)Tb4b4b4)
Te6edf3fileTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8fflxmf_deliveryTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3messageTb4b4b4)Tb4b4b4:
Te6edf3time_string Tff7b72= Te6edf3timeTff7b72.Td2a8ffstrftimeTb4b4b4(Ta5d6ff"Ta5d6ff%Ta5d6ffY-Ta5d6ff%Ta5d6ffm-Tffd700%dTa5d6ff Ta5d6ff%Ta5d6ffH:Ta5d6ff%Ta5d6ffM:Ta5d6ff%Ta5d6ffSTa5d6ff"Tb4b4b4, Te6edf3timeTff7b72.Td2a8fflocaltimeTb4b4b4(Te6edf3messageTff7b72.Td2a8fftimestampTb4b4b4)Tb4b4b4)
Te6edf3signature_string Tff7b72= Ta5d6ff"Ta5d6ffSignature is invalid, reason undeterminedTa5d6ff"
Tff7b72if Te6edf3messageTff7b72.Td2a8ffsignature_validatedTb4b4b4:
Te6edf3signature_string Tff7b72= Ta5d6ff"Ta5d6ffValidatedTa5d6ff"
Tff7b72elseTb4b4b4:
Tff7b72if Te6edf3messageTff7b72.Td2a8ffunverified_reason Tff7b72== Te6edf3LXMFTff7b72.Td2a8ffLXMessageTff7b72.Td2a8ffSIGNATURE_INVALIDTb4b4b4:
Te6edf3signature_string Tff7b72= Ta5d6ff"Ta5d6ffInvalid signatureTa5d6ff"
Tff7b72if Te6edf3messageTff7b72.Td2a8ffunverified_reason Tff7b72== Te6edf3LXMFTff7b72.Td2a8ffLXMessageTff7b72.Td2a8ffSOURCE_UNKNOWNTb4b4b4:
Te6edf3signature_string Tff7b72= Ta5d6ff"Ta5d6ffCannot verify, source is unknownTa5d6ff"
Te6edf3nomadnetTff7b72.Td2a8ffConversationTff7b72.Td2a8ffingestTb4b4b4(Te6edf3messageTb4b4b4, Tff7b72selfTb4b4b4)
Tff7b72def Td2a8ffconversationsTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Te6edf3nomadnetTff7b72.Td2a8ffConversationTff7b72.Td2a8ffconversation_listTb4b4b4(Tff7b72selfTb4b4b4)
Tff7b72def Td2a8ffhas_unread_conversationsTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tffa657lenTb4b4b4(Te6edf3nomadnetTff7b72.Td2a8ffConversationTff7b72.Td2a8ffunread_conversationsTb4b4b4) Tff7b72> T79c0ff0Tb4b4b4:
Tff7b72return Tff7b72True
Tff7b72elseTb4b4b4:
Tff7b72return Tff7b72False
Tff7b72def Td2a8ffconversation_is_unreadTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3source_hashTb4b4b4)Tb4b4b4:
Tff7b72if Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Te6edf3source_hashTb4b4b4) Tff7b72in Te6edf3nomadnetTff7b72.Td2a8ffConversationTff7b72.Td2a8ffunread_conversationsTb4b4b4:
Tff7b72return Tff7b72True
Tff7b72elseTb4b4b4:
Tff7b72return Tff7b72False
Tff7b72def Td2a8ffmark_conversation_readTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3source_hashTb4b4b4)Tb4b4b4:
Tff7b72if Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Te6edf3source_hashTb4b4b4) Tff7b72in Te6edf3nomadnetTff7b72.Td2a8ffConversationTff7b72.Td2a8ffunread_conversationsTb4b4b4:
Te6edf3nomadnetTff7b72.Td2a8ffConversationTff7b72.Td2a8ffunread_conversationsTff7b72.Td2a8ffpopTb4b4b4(Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Te6edf3source_hashTb4b4b4)Tb4b4b4)
Tff7b72if Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Tff7b72selfTff7b72.Td2a8ffconversationpath Tff7b72+ Ta5d6ff"Ta5d6ff/Ta5d6ff" Tff7b72+ Te6edf3source_hash Tff7b72+ Ta5d6ff"Ta5d6ff/unreadTa5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3osTff7b72.Td2a8ffunlinkTb4b4b4(Tff7b72selfTff7b72.Td2a8ffconversationpath Tff7b72+ Ta5d6ff"Ta5d6ff/Ta5d6ff" Tff7b72+ Te6edf3source_hash Tff7b72+ Ta5d6ff"Ta5d6ff/unreadTa5d6ff"Tb4b4b4)
Tff7b72def Td2a8ffcreateDefaultConfigTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffconfig Tff7b72= Te6edf3ConfigObjTb4b4b4(Te6edf3__default_nomadnet_config__Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffconfigTff7b72.Td2a8fffilename Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigpath
Tff7b72if Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisdirTb4b4b4(Tff7b72selfTff7b72.Td2a8ffconfigdirTb4b4b4)Tb4b4b4:
Te6edf3osTff7b72.Td2a8ffmakedirsTb4b4b4(Tff7b72selfTff7b72.Td2a8ffconfigdirTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffconfigTff7b72.Td2a8ffwriteTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffapplyConfigTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ffapplyConfigTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Ta5d6ff"Ta5d6ffloggingTa5d6ff" Tff7b72in Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4:
Tff7b72for Te6edf3option Tff7b72in Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffloggingTa5d6ff"Tb4b4b4]Tb4b4b4:
Te6edf3value Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffloggingTa5d6ff"Tb4b4b4]Tb4b4b4[Te6edf3optionTb4b4b4]
Tff7b72if Te6edf3option Tff7b72== Ta5d6ff"Ta5d6ffloglevelTa5d6ff"Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8ffloglevel Tff7b72= Tffa657intTb4b4b4(Te6edf3valueTb4b4b4)
Tff7b72if Te6edf3RNSTff7b72.Td2a8ffloglevel Tff7b72< T79c0ff0Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8ffloglevel Tff7b72= T79c0ff0
Tff7b72if Te6edf3RNSTff7b72.Td2a8ffloglevel Tff7b72> T79c0ff7Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8ffloglevel Tff7b72= T79c0ff7
Tff7b72if Te6edf3option Tff7b72== Ta5d6ff"Ta5d6ffdestinationTa5d6ff"Tb4b4b4:
Tff7b72if Te6edf3valueTff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4) Tff7b72== Ta5d6ff"Ta5d6fffileTa5d6ff" Tff7b72and Tff7b72not Tff7b72selfTff7b72.Td2a8ffforce_console_logTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogdest Tff7b72= Te6edf3RNSTff7b72.Td2a8ffLOG_FILE
Tff7b72if Ta5d6ff"Ta5d6fflogfileTa5d6ff" Tff7b72in Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffloggingTa5d6ff"Tb4b4b4]Tb4b4b4:
Tff7b72selfTff7b72.Td2a8fflogfilepath Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffloggingTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6fflogfileTa5d6ff"Tb4b4b4]
Te6edf3RNSTff7b72.Td2a8fflogfile Tff7b72= Tff7b72selfTff7b72.Td2a8fflogfilepath
Tff7b72elseTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogdest Tff7b72= Te6edf3RNSTff7b72.Td2a8ffLOG_STDOUT
Tff7b72if Ta5d6ff"Ta5d6ffclientTa5d6ff" Tff7b72in Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4:
Tff7b72for Te6edf3option Tff7b72in Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffclientTa5d6ff"Tb4b4b4]Tb4b4b4:
Te6edf3value Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffclientTa5d6ff"Tb4b4b4]Tb4b4b4[Te6edf3optionTb4b4b4]
Tff7b72if Te6edf3option Tff7b72== Ta5d6ff"Ta5d6ffenable_clientTa5d6ff"Tb4b4b4:
Te6edf3value Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffclientTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_boolTb4b4b4(Te6edf3optionTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffenable_client Tff7b72= Te6edf3value
Tff7b72if Te6edf3option Tff7b72== Ta5d6ff"Ta5d6ffdownloads_pathTa5d6ff"Tb4b4b4:
Te6edf3value Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffclientTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffdownloads_pathTa5d6ff"Tb4b4b4]
Tff7b72selfTff7b72.Td2a8ffdownloads_path Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffexpanduserTb4b4b4(Te6edf3valueTb4b4b4)
Tff7b72if Te6edf3option Tff7b72== Ta5d6ff"Ta5d6ffannounce_at_startTa5d6ff"Tb4b4b4:
Te6edf3value Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffclientTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_boolTb4b4b4(Te6edf3optionTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffpeer_announce_at_start Tff7b72= Te6edf3value
Tff7b72if Te6edf3option Tff7b72== Ta5d6ff"Ta5d6fftry_propagation_on_send_failTa5d6ff"Tb4b4b4:
Te6edf3value Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffclientTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_boolTb4b4b4(Te6edf3optionTb4b4b4)
Tff7b72selfTff7b72.Td2a8fftry_propagation_on_fail Tff7b72= Te6edf3value
Tff7b72if Te6edf3option Tff7b72== Ta5d6ff"Ta5d6ffperiodic_lxmf_syncTa5d6ff"Tb4b4b4:
Te6edf3value Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffclientTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_boolTb4b4b4(Te6edf3optionTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffperiodic_lxmf_sync Tff7b72= Te6edf3value
Tff7b72if Te6edf3option Tff7b72== Ta5d6ff"Ta5d6fflxmf_sync_intervalTa5d6ff"Tb4b4b4:
Te6edf3value Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffclientTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_intTb4b4b4(Te6edf3optionTb4b4b4)Tff7b72*T79c0ff60
Tff7b72if Te6edf3value Tff7b72>Tff7b72= T79c0ff60Tb4b4b4:
Tff7b72selfTff7b72.Td2a8fflxmf_sync_interval Tff7b72= Te6edf3value
Tff7b72if Te6edf3option Tff7b72== Ta5d6ff"Ta5d6fflxmf_sync_limitTa5d6ff"Tb4b4b4:
Te6edf3value Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffclientTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_intTb4b4b4(Te6edf3optionTb4b4b4)
Tff7b72if Te6edf3value Tff7b72> T79c0ff0Tb4b4b4:
Tff7b72selfTff7b72.Td2a8fflxmf_sync_limit Tff7b72= Te6edf3value
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8fflxmf_sync_limit Tff7b72= Tff7b72None
Tff7b72if Te6edf3option Tff7b72== Ta5d6ff"Ta5d6ffuser_interfaceTa5d6ff"Tb4b4b4:
Te6edf3value Tff7b72= Te6edf3valueTff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3value Tff7b72== Ta5d6ff"Ta5d6ffnoneTa5d6ff"Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffuimode Tff7b72= Te6edf3nomadnetTff7b72.Td2a8ffuiTff7b72.Td2a8ffUI_NONE
Tff7b72if Te6edf3value Tff7b72== Ta5d6ff"Ta5d6ffmenuTa5d6ff"Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffuimode Tff7b72= Te6edf3nomadnetTff7b72.Td2a8ffuiTff7b72.Td2a8ffUI_MENU
Tff7b72if Te6edf3value Tff7b72== Ta5d6ff"Ta5d6fftextTa5d6ff"Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffuimode Tff7b72= Te6edf3nomadnetTff7b72.Td2a8ffuiTff7b72.Td2a8ffUI_TEXT
Tff7b72if Ta5d6ff"Ta5d6fftextuiTa5d6ff" Tff7b72in Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4:
Tff7b72if Tff7b72not Ta5d6ff"Ta5d6ffintro_timeTa5d6ff" Tff7b72in Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6fftextuiTa5d6ff"Tb4b4b4]Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6fftextuiTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffintro_timeTa5d6ff"Tb4b4b4] Tff7b72= T79c0ff1
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6fftextuiTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffintro_timeTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6fftextuiTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_intTb4b4b4(Ta5d6ff"Ta5d6ffintro_timeTa5d6ff"Tb4b4b4)
Tff7b72if Tff7b72not Ta5d6ff"Ta5d6ffintro_textTa5d6ff" Tff7b72in Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6fftextuiTa5d6ff"Tb4b4b4]Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6fftextuiTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffintro_textTa5d6ff"Tb4b4b4] Tff7b72= Ta5d6ff"Ta5d6ffNomad NetworkTa5d6ff"
Tff7b72if Tff7b72not Ta5d6ff"Ta5d6ffeditorTa5d6ff" Tff7b72in Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6fftextuiTa5d6ff"Tb4b4b4]Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6fftextuiTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffeditorTa5d6ff"Tb4b4b4] Tff7b72= Ta5d6ff"Ta5d6ffeditorTa5d6ff"
Tff7b72if Tff7b72not Ta5d6ff"Ta5d6ffglyphsTa5d6ff" Tff7b72in Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6fftextuiTa5d6ff"Tb4b4b4]Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6fftextuiTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffglyphsTa5d6ff"Tb4b4b4] Tff7b72= Ta5d6ff"Ta5d6ffunicodeTa5d6ff"
Tff7b72if Tff7b72not Ta5d6ff"Ta5d6ffmouse_enabledTa5d6ff" Tff7b72in Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6fftextuiTa5d6ff"Tb4b4b4]Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6fftextuiTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffmouse_enabledTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72True
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6fftextuiTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffmouse_enabledTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6fftextuiTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_boolTb4b4b4(Ta5d6ff"Ta5d6ffmouse_enabledTa5d6ff"Tb4b4b4)
Tff7b72if Tff7b72not Ta5d6ff"Ta5d6ffhide_guideTa5d6ff" Tff7b72in Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6fftextuiTa5d6ff"Tb4b4b4]Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6fftextuiTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffhide_guideTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72False
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6fftextuiTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffhide_guideTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6fftextuiTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_boolTb4b4b4(Ta5d6ff"Ta5d6ffhide_guideTa5d6ff"Tb4b4b4)
Tff7b72if Tff7b72not Ta5d6ff"Ta5d6ffanimation_intervalTa5d6ff" Tff7b72in Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6fftextuiTa5d6ff"Tb4b4b4]Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6fftextuiTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffanimation_intervalTa5d6ff"Tb4b4b4] Tff7b72= T79c0ff1
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6fftextuiTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffanimation_intervalTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6fftextuiTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_intTb4b4b4(Ta5d6ff"Ta5d6ffanimation_intervalTa5d6ff"Tb4b4b4)
Tff7b72if Tff7b72not Ta5d6ff"Ta5d6ffcolormodeTa5d6ff" Tff7b72in Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6fftextuiTa5d6ff"Tb4b4b4]Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6fftextuiTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffcolormodeTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3nomadnetTff7b72.Td2a8ffuiTff7b72.Td2a8ffCOLORMODE_16
Tff7b72elseTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6fftextuiTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffcolormodeTa5d6ff"Tb4b4b4]Tff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4) Tff7b72== Ta5d6ff"Ta5d6ffmonochromeTa5d6ff"Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6fftextuiTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffcolormodeTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3nomadnetTff7b72.Td2a8ffuiTff7b72.Td2a8ffTextUITff7b72.Td2a8ffCOLORMODE_MONO
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6fftextuiTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffcolormodeTa5d6ff"Tb4b4b4]Tff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4) Tff7b72== Ta5d6ff"Ta5d6ff16Ta5d6ff"Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6fftextuiTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffcolormodeTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3nomadnetTff7b72.Td2a8ffuiTff7b72.Td2a8ffTextUITff7b72.Td2a8ffCOLORMODE_16
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6fftextuiTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffcolormodeTa5d6ff"Tb4b4b4]Tff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4) Tff7b72== Ta5d6ff"Ta5d6ff88Ta5d6ff"Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6fftextuiTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffcolormodeTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3nomadnetTff7b72.Td2a8ffuiTff7b72.Td2a8ffTextUITff7b72.Td2a8ffCOLORMODE_88
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6fftextuiTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffcolormodeTa5d6ff"Tb4b4b4]Tff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4) Tff7b72== Ta5d6ff"Ta5d6ff256Ta5d6ff"Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6fftextuiTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffcolormodeTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3nomadnetTff7b72.Td2a8ffuiTff7b72.Td2a8ffTextUITff7b72.Td2a8ffCOLORMODE_256
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6fftextuiTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffcolormodeTa5d6ff"Tb4b4b4]Tff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4) Tff7b72== Ta5d6ff"Ta5d6ff24bitTa5d6ff"Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6fftextuiTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffcolormodeTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3nomadnetTff7b72.Td2a8ffuiTff7b72.Td2a8ffTextUITff7b72.Td2a8ffCOLORMODE_TRUE
Tff7b72elseTb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffThe selected Text UI color mode is invalidTa5d6ff"Tb4b4b4)
Tff7b72if Tff7b72not Ta5d6ff"Ta5d6ffthemeTa5d6ff" Tff7b72in Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6fftextuiTa5d6ff"Tb4b4b4]Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6fftextuiTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffthemeTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3nomadnetTff7b72.Td2a8ffuiTff7b72.Td2a8ffTextUITff7b72.Td2a8ffTHEME_DARK
Tff7b72elseTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6fftextuiTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffthemeTa5d6ff"Tb4b4b4]Tff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4) Tff7b72== Ta5d6ff"Ta5d6ffdarkTa5d6ff"Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6fftextuiTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffthemeTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3nomadnetTff7b72.Td2a8ffuiTff7b72.Td2a8ffTextUITff7b72.Td2a8ffTHEME_DARK
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6fftextuiTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffthemeTa5d6ff"Tb4b4b4]Tff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4) Tff7b72== Ta5d6ff"Ta5d6fflightTa5d6ff"Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6fftextuiTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffthemeTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3nomadnetTff7b72.Td2a8ffuiTff7b72.Td2a8ffTextUITff7b72.Td2a8ffTHEME_LIGHT
Tff7b72elseTb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffThe selected Text UI theme is invalidTa5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72raise Tf85149KeyErrorTb4b4b4(Ta5d6ff"Ta5d6ffText UI selected in configuration file, but no [textui] section foundTa5d6ff"Tb4b4b4)
Tff7b72if Te6edf3value Tff7b72== Ta5d6ff"Ta5d6ffgraphicalTa5d6ff"Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffuimode Tff7b72= Te6edf3nomadnetTff7b72.Td2a8ffuiTff7b72.Td2a8ffUI_GRAPHICAL
Tff7b72if Te6edf3value Tff7b72== Ta5d6ff"Ta5d6ffwebTa5d6ff"Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffuimode Tff7b72= Te6edf3nomadnetTff7b72.Td2a8ffuiTff7b72.Td2a8ffUI_WEB
Tff7b72if Ta5d6ff"Ta5d6ffnodeTa5d6ff" Tff7b72in Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4:
Tff7b72if Tff7b72not Ta5d6ff"Ta5d6ffenable_nodeTa5d6ff" Tff7b72in Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffnodeTa5d6ff"Tb4b4b4]Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffenable_node Tff7b72= Tff7b72False
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffenable_node Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffnodeTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_boolTb4b4b4(Ta5d6ff"Ta5d6ffenable_nodeTa5d6ff"Tb4b4b4)
Tff7b72if Tff7b72not Ta5d6ff"Ta5d6ffnode_nameTa5d6ff" Tff7b72in Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffnodeTa5d6ff"Tb4b4b4]Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffnode_name Tff7b72= Tff7b72None
Tff7b72elseTb4b4b4:
Te6edf3value Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffnodeTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffnode_nameTa5d6ff"Tb4b4b4]
Tff7b72if Te6edf3valueTff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4) Tff7b72== Ta5d6ff"Ta5d6ffnoneTa5d6ff"Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffnode_name Tff7b72= Tff7b72None
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffnode_name Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffnodeTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffnode_nameTa5d6ff"Tb4b4b4]
Tff7b72if Tff7b72not Ta5d6ff"Ta5d6ffannounce_at_startTa5d6ff" Tff7b72in Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffnodeTa5d6ff"Tb4b4b4]Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffnode_announce_at_start Tff7b72= Tff7b72False
Tff7b72elseTb4b4b4:
Te6edf3value Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffnodeTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_boolTb4b4b4(Ta5d6ff"Ta5d6ffannounce_at_startTa5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffnode_announce_at_start Tff7b72= Te6edf3value
Tff7b72if Tff7b72not Ta5d6ff"Ta5d6ffannounce_intervalTa5d6ff" Tff7b72in Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffnodeTa5d6ff"Tb4b4b4]Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffnode_announce_interval Tff7b72= T79c0ff720
Tff7b72elseTb4b4b4:
Te6edf3value Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffnodeTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_intTb4b4b4(Ta5d6ff"Ta5d6ffannounce_intervalTa5d6ff"Tb4b4b4)
Tff7b72if Te6edf3value Tff7b72< T79c0ff1Tb4b4b4:
Te6edf3value Tff7b72= T79c0ff1
Tff7b72selfTff7b72.Td2a8ffnode_announce_interval Tff7b72= Te6edf3value
Tff7b72if Ta5d6ff"Ta5d6ffpages_pathTa5d6ff" Tff7b72in Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffnodeTa5d6ff"Tb4b4b4]Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffpagespath Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffnodeTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffpages_pathTa5d6ff"Tb4b4b4]
Tff7b72if Ta5d6ff"Ta5d6fffiles_pathTa5d6ff" Tff7b72in Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffnodeTa5d6ff"Tb4b4b4]Tb4b4b4:
Tff7b72selfTff7b72.Td2a8fffilespath Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffnodeTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6fffiles_pathTa5d6ff"Tb4b4b4]
Tff7b72if Ta5d6ff"Ta5d6ffprioritise_destinationsTa5d6ff" Tff7b72in Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffnodeTa5d6ff"Tb4b4b4]Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffprioritised_lxmf_destinations Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffnodeTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_listTb4b4b4(Ta5d6ff"Ta5d6ffprioritise_destinationsTa5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffprioritised_lxmf_destinations Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72if Tff7b72not Ta5d6ff"Ta5d6ffmessage_storage_limitTa5d6ff" Tff7b72in Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffnodeTa5d6ff"Tb4b4b4]Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffmessage_storage_limit Tff7b72= T79c0ff2
Tff7b72elseTb4b4b4:
Te6edf3value Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffnodeTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_floatTb4b4b4(Ta5d6ff"Ta5d6ffmessage_storage_limitTa5d6ff"Tb4b4b4)
Tff7b72if Te6edf3value Tff7b72< T79c0ff0.064Tb4b4b4:
Te6edf3value Tff7b72= T79c0ff0.064
Tff7b72selfTff7b72.Td2a8ffmessage_storage_limit Tff7b72= Te6edf3value
Tf0883e@staticmethod
Tff7b72def Td2a8ffget_shared_instanceTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3NomadNetworkAppTff7b72.Td2a8ff_shared_instance Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72return Te6edf3NomadNetworkAppTff7b72.Td2a8ff_shared_instance
Tff7b72elseTb4b4b4:
Tff7b72raise Tf85149UnboundLocalErrorTb4b4b4(Ta5d6ff"Ta5d6ffNo Nomad Network applications have been instantiated yetTa5d6ff"Tb4b4b4)
Tff7b72def Td2a8ffquitTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffNomad Network Client shutting down...Ta5d6ff"Tb4b4b4)
Te6edf3osTff7b72.Td2a8ff_exitTb4b4b4(T79c0ff0Tb4b4b4)
T8b949e# Default configuration file:
Te6edf3__default_nomadnet_config__ Tff7b72= Ta5d6ff'''Ta5d6ff# This is the default Nomad Network config file.
Ta5d6ff# You should probably edit it to suit your needs and use-case,
Ta5d6ff[logging]
Ta5d6ff# Valid log levels are 0 through 7:
Ta5d6ff# 0: Log only critical information
Ta5d6ff# 1: Log errors and lower log levels
Ta5d6ff# 2: Log warnings and lower log levels
Ta5d6ff# 3: Log notices and lower log levels
Ta5d6ff# 4: Log info and lower (this is the default)
Ta5d6ff# 5: Verbose logging
Ta5d6ff# 6: Debug logging
Ta5d6ff# 7: Extreme logging
Ta5d6ffloglevel = 4
Ta5d6ffdestination = file
Ta5d6ff[client]
Ta5d6ffenable_client = yes
Ta5d6ffuser_interface = text
Ta5d6ffdownloads_path = ~/Downloads
Ta5d6ff# By default, the peer is announced at startup
Ta5d6ff# to let other peers reach it immediately.
Ta5d6ffannounce_at_start = yes
Ta5d6ff# By default, the client will try to deliver a
Ta5d6ff# message via the LXMF propagation network, if
Ta5d6ff# a direct delivery to the recipient is not
Ta5d6ff# possible.
Ta5d6fftry_propagation_on_send_fail = yes
Ta5d6ff# Nomadnet will periodically sync messages from
Ta5d6ff# LXMF propagation nodes by default, if any are
Ta5d6ff# present. You can disable this if you want to
Ta5d6ff# only sync when manually initiated.
Ta5d6ffperiodic_lxmf_sync = yes
Ta5d6ff# The sync interval in minutes. This value is
Ta5d6ff# equal to 6 hours (360 minutes) by default.
Ta5d6fflxmf_sync_interval = 360
Ta5d6ff# By default, automatic LXMF syncs will only
Ta5d6ff# download 8 messages at a time. You can change
Ta5d6ff# this number, or set the option to 0 to disable
Ta5d6ff# the limit, and download everything every time.
Ta5d6fflxmf_sync_limit = 8
Ta5d6ff[textui]
Ta5d6ff# Amount of time to show intro screen
Ta5d6ffintro_time = 1
Ta5d6ff# You can specify the display theme.
Ta5d6ff# theme = light
Ta5d6fftheme = dark
Ta5d6ff# Specify the number of colors to use
Ta5d6ff# valid colormodes are:
Ta5d6ff# monochrome, 16, 88, 256 and 24bit
Ta5d6ff#
Ta5d6ff# The default is a conservative 256 colors.
Ta5d6ff# If your terminal does not support this,
Ta5d6ff# you can lower it. Some terminals support
Ta5d6ff# 24 bit color.
Ta5d6ff# colormode = monochrome
Ta5d6ff# colormode = 16
Ta5d6ff# colormode = 88
Ta5d6ffcolormode = 256
Ta5d6ff# colormode = 24bit
Ta5d6ff# By default, unicode glyphs are used. If
Ta5d6ff# you have a Nerd Font installed, you can
Ta5d6ff# enable this for a better user interface.
Ta5d6ff# You can also enable plain text glyphs if
Ta5d6ff# your terminal doesnTa5d6ff'Ta5d6fft support unicode.
Ta5d6ff# glyphs = plain
Ta5d6ffglyphs = unicode
Ta5d6ff# glyphs = nerdfont
Ta5d6ff# You can specify whether mouse events
Ta5d6ff# should be considered as input to the
Ta5d6ff# application. On by default.
Ta5d6ffmouse_enabled = True
Ta5d6ff# What editor to use for editing text. By
Ta5d6ff# default the operating systems Ta5d6ff"Ta5d6ffeditorTa5d6ff"
Ta5d6ff# alias will be used.
Ta5d6ffeditor = editor
Ta5d6ff# If you donTa5d6ff'Ta5d6fft want the Guide section to
Ta5d6ff# show up in the menu, you can disable it.
Ta5d6ffhide_guide = no
Ta5d6ff[node]
Ta5d6ff# Whether to enable node hosting
Ta5d6ffenable_node = no
Ta5d6ff# The node name will be visible to other
Ta5d6ff# peers on the network, and included in
Ta5d6ff# announces.
Ta5d6ffnode_name = None
Ta5d6ff# Automatic announce interval in minutes.
Ta5d6ff# 6 hours by default.
Ta5d6ffannounce_interval = 360
Ta5d6ff# Whether to announce when the node starts.
Ta5d6ffannounce_at_start = Yes
Ta5d6ff# The maximum amount of storage to use for
Ta5d6ff# the LXMF Propagation Node message store,
Ta5d6ff# specified in gigabytes. When this limit
Ta5d6ff# is reached, LXMF will periodically remove
Ta5d6ff# messages in its message store. By default,
Ta5d6ff# LXMF prioritises keeping messages that are
Ta5d6ff# new and small. Large and old messages will
Ta5d6ff# be removed first. This setting is optional
Ta5d6ff# and defaults to 2 gigabytes.
Ta5d6ff# message_storage_limit = 2
Ta5d6ff# You can tell the LXMF message router to
Ta5d6ff# prioritise storage for one or more
Ta5d6ff# destinations. If the message store reaches
Ta5d6ff# the specified limit, LXMF will prioritise
Ta5d6ff# keeping messages for destinations specified
Ta5d6ff# with this option. This setting is optional,
Ta5d6ff# and generally you do not need to use it.
Ta5d6ff# prioritise_destinations = 10bc7624c27032a18639, ba780a6dff4cc1391db8
Ta5d6ff'''Tff7b72.Td2a8ffsplitlinesTb4b4b4(Tb4b4b4)
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────